#include <func.h>

int directories = 0, files = 0;

void dfs_print(const char* path, int width);
int main(int argc, char* argv[])
{
	// ./young_tree path
	if (argc != 2) {
		error(1, 0, "Usage: %s path", argv[0]);
	}

	// 打印路径的名字
	puts(argv[1]);
	// 递归打印每一个目录项
	dfs_print(argv[1], 4);

	printf("\n%d directories, %d files\n", directories, files);

    return 0;
}

void dfs_print(const char* path, int width) {
	// 1. 打开目录流
	DIR* stream = opendir(path);
	if (!stream) {
		error(1, errno, "opendir %s", path);
	}

	// 2. 顺序读取每一个目录项
	errno = 0;
	struct dirent* p;
	while ((p = readdir(stream)) != NULL) {
		const char* name = p->d_name;
		// 忽略.和.. (避免无限递归)
		if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) {
			continue;
		}
		// 遍历根结点
		for(int i = 0; i < width; i++) {
			putchar(' ');
		}
		puts(name);
		// 遍历每一棵子树
		if (p->d_type == DT_DIR) {
			directories++;
			// 拼接路径
			char subpath[256];
			sprintf(subpath, "%s/%s", path, name);
			// 递归遍历
			dfs_print(subpath, width + 4);
		} else if (p->d_type == DT_REG) {
			files++;
		}
	} // p == NULL
	if (errno) {
		error(0, errno, "readdir");
	}

	// 3. 关闭目录流
	closedir(stream);
}
